//
//  LandscapeTabBarView.m
//  UITableView横向滚动
//
//  Created by afro on 15/12/26.
//  Copyright © 2015年 afro. All rights reserved.
//

#import "CFBTLandscapeTabBarView.h"
#import "CFBTTopicTableVC.h"

#define MenuBarCellID @"landscapeTabBarCell"
#define ContentCellID @"landscapeContentCell"


static CGFloat const menuBarW = 44;         // 菜单栏的高度
static CGFloat const menuBarCellH = 68;     // Cell的高度
static CGFloat const CellTitleViewW = 68;   // 菜单栏标题View的宽度
static CGFloat const indicatorW = 2;        // 指示器高度

@interface CFBTLandscapeTabBarView ()<UITableViewDataSource,UITableViewDelegate>

/** 横向滚动的菜单栏tableView*/
@property (weak, nonatomic) UITableView *landscapeTableView;

/** 横向滚动的内容tableView*/
@property (weak, nonatomic) UITableView *landscapeContentTableView;

/** 菜单栏指示器*/
@property (weak, nonatomic) UIView *indicatorView;

/** 计算页码*/
@property (assign, nonatomic) NSUInteger pageIndex;

/** 记录选中的标题Label*/
@property (strong, nonatomic) UILabel *selectLabel;

@end

@implementation CFBTLandscapeTabBarView

#pragma mark - 菜单栏标题内容懒加载
- (void)setTitleArr:(NSArray *)titleArr {
    
    if (_titleArr == nil) {
        
        _titleArr = [NSArray array];
        
    }
    _titleArr = titleArr;
    
    [self.landscapeTableView reloadData];
}

#pragma mark - 创建菜单栏和内容的tableView
- (void)layoutSubviews {
    
    [super layoutSubviews];
    // 1.创建菜单栏tableView
    [self setupLandscapeTableView];
    
    // 2.创建内容tableView
    [self setupLandscapeContentView];
    
    // 3.创建指示器
    [self setupIndicatorView];
    
    
}

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        
    }
    return self;
}
// 1.创建菜单栏tableView
- (void)setupLandscapeTableView {
    
    UITableView *landscapeTableView = [[UITableView alloc] init];
    
#warning 菜单栏的背景颜色
    landscapeTableView.backgroundColor = [UIColor clearColor];
    
    self.landscapeTableView = landscapeTableView;
    
    // 菜单栏的宽度等于View的宽度
    CGFloat menuBarH = self.frame.size.width;
    
    // View宽度减去菜单栏宽度的一半
    // 只有这样当菜单栏的tableView横向的时候才能正好显示
    CGFloat x = (menuBarH - menuBarW) * 0.5;
    
    // View宽度的一半加上菜单栏宽度的一半(负值)
    // 只有这样当菜单栏的tableView横向的时候才能正好显示
    CGFloat y = (menuBarW - menuBarH) * 0.5;
    
    // 1.1 设置未旋转之前菜单栏的frame
    landscapeTableView.frame = CGRectMake(x, y, menuBarW, menuBarH);
    
    // 1.2 旋转-90度,就可以实现横向滚动,tabBarW变成菜单栏的高度值,tabBarH变成菜单栏的宽度值
    landscapeTableView.transform = CGAffineTransformMakeRotation(- M_PI_2);
    
    landscapeTableView.dataSource = self;
    landscapeTableView.delegate = self;
    
    // 1.3 去掉cell之间的分割线
    landscapeTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    
    // 1.4 是否显示垂直滚动栏
    landscapeTableView.showsVerticalScrollIndicator = NO;
    
    // 1.5 添加到view上
    [self addSubview:landscapeTableView];
}

// 2.创建内容tableView
- (void)setupLandscapeContentView {
    
    UITableView *landscapeContentTableView = [[UITableView alloc] init];
    
    // 高度和宽度
    CGFloat contentH = CGRectGetWidth(self.frame);
    CGFloat contentW  = CGRectGetHeight(self.frame);
    
    // x,y坐标和菜单栏坐标计算方法类似,只不过y从菜单栏的最大Y值开始
    CGFloat x = (contentH - contentW) * 0.5;
    CGFloat y = (contentW -contentH) * 0.5 + menuBarW;
    
    // 2.1 设置frame
    landscapeContentTableView.frame = CGRectMake(x, y, contentW, contentH);
    
    // 2.2 旋转90度
    landscapeContentTableView.transform = CGAffineTransformMakeRotation(- M_PI_2);
    
    // 2.3 滚动条隐藏
    landscapeContentTableView.showsVerticalScrollIndicator = NO;
    
    // 2.4 取消分割线
    landscapeContentTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    
    // 2.5 是否开启分页
    landscapeContentTableView.pagingEnabled = YES;
    
    // 2.6 弹簧效果
    landscapeContentTableView.bounces = NO;
    
    landscapeContentTableView.dataSource = self;
    landscapeContentTableView.delegate = self;
    
    self.landscapeContentTableView = landscapeContentTableView;
    
    // 2.7 添加到view上
    [self addSubview:landscapeContentTableView];

}

// 3.创建指示器View
- (void)setupIndicatorView {
    
    // 3.1 设置指示器初始frame,高度自定义,宽度和标题栏Cell宽度相等
    CGRect  indicatorRect = CGRectMake(0, 0, indicatorW, menuBarCellH);
    UIView *indicatorView = [[UIView alloc] initWithFrame:indicatorRect];
    indicatorView.backgroundColor = [UIColor redColor];
    self.indicatorView = indicatorView;
    
    // 3.2 添加到顶部菜单栏
    [self.landscapeTableView addSubview:indicatorView];
    
    // 3.3 置前,可见
    [self.landscapeTableView bringSubviewToFront:indicatorView];
}
#pragma mark - 数据源和代理方法
// 4.设置tableView行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.titleArr.count;
}

// 5.设置Cell显示的内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 5.1 设置菜单栏每个Cell的内容
    if (tableView == self.landscapeTableView) {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MenuBarCellID];
        if(cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MenuBarCellID];
        }

        // 5.2 移除cell自带的所有子控件
        [[cell.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview) withObject:nil];
        
        // 5.3 创建菜单栏标题View
        UIView *titleItem = [self addTitleViewToCell:indexPath];
        
        // 5.4 设置菜单栏标题View的frame
        CGFloat x = (menuBarW - CGRectGetWidth(titleItem.frame)) * 0.5;
        CGFloat y = (menuBarCellH - CGRectGetHeight(titleItem.frame)) * 0.5;
        titleItem.frame = CGRectMake(x,y,CGRectGetWidth(titleItem.frame),CGRectGetHeight(titleItem.frame));
        
        // 5.5 菜单栏标题View旋转90度
        titleItem.transform = CGAffineTransformMakeRotation(M_PI_2);

        // 5.6 添加菜单栏标题View到cell中去
        [cell.contentView addSubview:titleItem];
        
        // 5.7 设置cell的frame
        cell.frame = CGRectMake(0,0,menuBarW,self.frame.size.width);
        
#warning 设置菜单栏cell的颜色
        cell.backgroundColor = [UIColor clearColor];
        
        // 5.8 取消cell的选中效果
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        
        return cell;
    }
    // 5.9 设置菜单栏下方tableView的cell内容
    if (tableView == self.landscapeContentTableView) {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ContentCellID];
        if(cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ContentCellID];
            
            // 5.11 设置cell的frame
            cell.frame = CGRectMake(0,0,self.frame.size.height,self.frame.size.width);
            
#warning 设置内容cell的颜色
            cell.backgroundColor = [self randomColor];
            
            // 5.12 取消cell的选中效果
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
            
        }

        // 5.10 移除cell自带的所有子控件
        [[cell.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview) withObject:nil];

        if([self.datasource respondsToSelector:@selector(selectTabBar:AtIndex:)])
        {
            // 外界传入的内容tableView
            UITableView *pageView = [self.datasource selectTabBar:self AtIndex:indexPath.row];
            
            CGFloat x = (CGRectGetWidth(cell.frame) - CGRectGetWidth(pageView.frame)) * 0.5;
            CGFloat y = (CGRectGetHeight(cell.frame) - CGRectGetHeight(pageView.frame)) * 0.5;
            pageView.frame = CGRectMake(x,y,CGRectGetWidth(pageView.frame),CGRectGetHeight(pageView.frame));
            pageView.transform = CGAffineTransformMakeRotation(M_PI_2);
            
            // 自动调整子控件与父控件之间的位置
            pageView.autoresizingMask = NO;
            
            [cell.contentView addSubview:pageView];

        }
        
        
        return cell;
    }
    
    return [[UITableViewCell alloc] initWithFrame:CGRectZero];
    
}

#warning 选中cell后要做的动作
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    // 6.如果选中了菜单栏的Cell
    if (tableView == self.landscapeTableView) {
        
        // 6.1 内容tableView自动滚动到中间位置
        [self.landscapeContentTableView scrollToRowAtIndexPath:indexPath
                                     atScrollPosition:UITableViewScrollPositionMiddle
                                             animated:NO];
        
        // 6.2 菜单栏自动滚动到中间位置
        [tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    }
}

// 7.设置Cell高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableView == self.landscapeTableView) {
        
        return menuBarCellH;
    }
    if (tableView == self.landscapeContentTableView) {
        return self.frame.size.width;
    }
    return 0;
}

// 8.开始滚动的时候调用
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    // 如果滚动的是菜单栏下边的TableView
    if(scrollView == self.landscapeContentTableView)
    {
        // 8.1 计算页码
        NSUInteger tempPage = (self.landscapeContentTableView.contentOffset.y + 0.5 * CGRectGetWidth(self.frame))/CGRectGetWidth(self.frame);
        
        if(tempPage != self.pageIndex)
            
            _pageIndex = tempPage;
        
        // 8.2 更新指示器位置
        [self updateIndicatorPosition];
        
    }
}

// 9.停止滚动的时候调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    // 如果滚动的是内容tableView
    if(scrollView == self.landscapeContentTableView)
    {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.pageIndex inSection:0];
        
        // 9.1 菜单栏滚动到中间位置
        [self.landscapeTableView scrollToRowAtIndexPath:indexPath
                                     atScrollPosition:UITableViewScrollPositionMiddle
                                             animated:YES];
    }
    
}

// 10.创建菜单栏标题View添加到cell
- (UIView *)addTitleViewToCell:(NSIndexPath *)indexPath
{
    
    // 10.1 标题View默认宽度和高度
    UIView *titleItem = [[UIView alloc] initWithFrame:CGRectMake(0, 0, menuBarCellH, CellTitleViewW)];
    
    // 菜单栏标题View的背景色
    titleItem.backgroundColor = [UIColor clearColor];
    
    // 10.2 显示标题的Label
    UILabel *label = [[UILabel alloc] initWithFrame:titleItem.bounds];
#warning 标题要显示的内容,由外部传入
    label.text = [NSString stringWithFormat:@"%@",self.titleArr[indexPath.row]];
    label.textColor = [UIColor grayColor];
    label.font = [UIFont systemFontOfSize:12 weight:0];
    label.textAlignment = NSTextAlignmentCenter;
    
    // 10.3 标签添加到标题View
    [titleItem addSubview:label];
    
    return titleItem;
}

// 8.2 刷新指示器的位置
- (void)updateIndicatorPosition
{
    CGFloat contentOffset = self.landscapeContentTableView.contentOffset.y;
    CGFloat contentSize = self.landscapeContentTableView.contentSize.height;
    
    CGFloat X = self.indicatorView.frame.origin.x;
    CGFloat Y = contentOffset / contentSize * self.landscapeTableView.contentSize.height;
    
    CGFloat W = self.indicatorView.frame.size.width;
    CGFloat H = self.indicatorView.frame.size.height;
    
    self.indicatorView.frame = CGRectMake(X,Y,W,H);
}

//随机生成一个颜色
- (UIColor *)randomColor{
    
    CGFloat r = arc4random_uniform(256) / 255.0;
    CGFloat g = arc4random_uniform(256) / 255.0;
    CGFloat b = arc4random_uniform(256) / 255.0;
    
    return [UIColor colorWithRed:r green:g blue:b alpha:1];
    
}
@end
